﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using QldtSdh.BLL;
using QldtSdh.GUI.Utils;

namespace QldtSdh.GUI.DuLieu
{
    using BLL;
    using DAL;
    using DAL.Models;
    using QldtSdh.Utils;
    using QldtSdh.GUI.Utils;

    public partial class FormQuanLyDeTaiLuanVan : QldtSdh.GUI.Common.BaseDialog
    {
        private bool _DoNotLoadDeTaiList = false;
        private bool _DoNotUpdateGuiBySelectedDeTai = false;

        private LoaiDeTai SelectedLoaiDeTai { get { return bsLoaiDeTai.Current == null ? null : bsLoaiDeTai.Current as LoaiDeTai; } }
        private DeTai SelectedDeTai { get { return bsDeTai.Current == null ? null : bsDeTai.Current as DeTai; } }

        public FormQuanLyDeTaiLuanVan()
        {
            InitializeComponent();

            gridDeTai.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridDeTai.AddRowIndexing();

            NapDanhSachLoaiDeTai();
        }

        private void NapDanhSachLoaiDeTai(string maLoaiDeTaiToSelect = null)
        {
            _DoNotLoadDeTaiList = true;
            var lstLoaiDeTai = BizDeTai.GetListLoaiDeTai();
            lstLoaiDeTai.Insert(0, new LoaiDeTai() { MaLoaiDeTai = "", TenLoaiDeTai = "<Tất cả>" });
            bsLoaiDeTai.DataSource = lstLoaiDeTai;
            cbxLoaiDeTai.DataSource = bsLoaiDeTai;
            cbxLoaiDeTai.DisplayMember = "TenLoaiDeTai";
            for (int i = 0; i < lstLoaiDeTai.Count; i++)
                if (lstLoaiDeTai[i].MaLoaiDeTai == maLoaiDeTaiToSelect)
                {
                    bsDeTai.Position = i;
                    break;
                }

            var lstChuyenNganhDaoTao = BizChuyenNganhDaoTao.GetList();
            lstChuyenNganhDaoTao.Insert(0, new NganhDaoTao() { MaNganhDaoTao = "", TenNganhDaoTao = "<Tất cả>" });
            _DoNotLoadDeTaiList = false;

            UpdateGuiBySelectedLoaiDeTai();
        }

        private void UpdateGuiBySelectedLoaiDeTai()
        {
            _DoNotUpdateGuiBySelectedDeTai = true;
            string tuKhoa = txtTuKhoa.Text.Trim();
            if (pnlFilterContainter.Visible == false)
                tuKhoa = "";
            var loaiDeTai = this.SelectedLoaiDeTai;
            var lstDeTai = new MySortableBindingList<DeTai>(BizDeTai.GetListDeTai(
                loaiDeTai, tuKhoa, chkTenDeTai.Checked, chkNguoiThucHien.Checked, chkNam.Checked));
            bsDeTai.DataSource = lstDeTai;
            gridDeTai.SetDataSource(bsDeTai);
            _DoNotUpdateGuiBySelectedDeTai = false;
            UpdateGuiBySelectedDeTai();
        }

        private void bsLoaiDeTai_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDeTaiList) return;
            UpdateGuiBySelectedLoaiDeTai();
        }

        private void bsNganhDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDeTaiList) return;
            UpdateGuiBySelectedLoaiDeTai();
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyDeTaiLuanVan_ChiTiet(null);
            frm.ShowDialog();
            if (frm.EffectedObjects > 0)
                UpdateGuiBySelectedLoaiDeTai();
        }

        private void bsDeTai_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotUpdateGuiBySelectedDeTai) return;
            UpdateGuiBySelectedDeTai();
        }

        private void UpdateGuiBySelectedDeTai()
        {
            var deTai = this.SelectedDeTai;
            if (deTai == null)
            {
                btnXoa.Enabled = btnSua.Enabled = false;
            }
            else
            {
                btnXoa.Enabled = btnSua.Enabled = true;
            }
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            var deTai = this.SelectedDeTai;
            if (deTai == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một đề tài để chỉnh sửa");
                return;
            }
            var frm = new FormQuanLyDeTaiLuanVan_ChiTiet(deTai);
            frm.ShowDialog();
            if (frm.EffectedObjects > 0)
                UpdateGuiBySelectedLoaiDeTai();
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            var deTai = this.SelectedDeTai;
            if (deTai == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một đề tài để xoá");
                return;
            }
            var lstIDToDeleted = new List<string>();
            foreach (DataGridViewRow row in gridDeTai.SelectedRows)
            {
                var x = row.DataBoundItem as DeTai;
                lstIDToDeleted.Add(x.MaDeTai);
            }

            if (lstIDToDeleted.Count == 1)
            {
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn xoá đề tài \"{0}\" không?", deTai.TenDeTai) == false)
                    return;
                try
                {
                    BizDeTai.Delete(deTai.MaDeTai);
                    UpdateGuiBySelectedLoaiDeTai();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể xoá đề tài.\nChi tiết lỗi: {0}", exc);
                }
            }
            else
            {
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn xoá {0} đề tài đang chọn không?", lstIDToDeleted.Count) == false)
                    return;
                try
                {
                    BizDeTai.Delete(lstIDToDeleted);
                    UpdateGuiBySelectedLoaiDeTai();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Có lỗi trong quá trình xoá các đề tài.\nChi tiết lỗi: {0}", exc);
                    UpdateGuiBySelectedLoaiDeTai();
                }
            }
        }

        private void lnkFilter_Click(object sender, EventArgs e)
        {
            pnlFilterContainter.Visible = !pnlFilterContainter.Visible;
            if (pnlFilterContainter.Visible == false)
                bsDeTai.RemoveFilter();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            pnlFilterContainter.Hide();
            bsDeTai.RemoveFilter();
        }

        private void gridDeTai_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (this.SelectedDeTai != null)
                btnSua_Click(null, null);
        }

        private void btnApplyFilter_Click(object sender, EventArgs e)
        {
            UpdateGuiBySelectedLoaiDeTai();
        }

        private void btnImport_Click(object sender, EventArgs e)
        {
            var frm = new FormDeTai_Import();
            frm.ShowDialog();
            UpdateGuiBySelectedLoaiDeTai();
        }

        private void lnkLoaiDeTai_Click(object sender, EventArgs e)
        {
            var selectedLoaiDeTai = this.SelectedLoaiDeTai;
            var selectedMaLoaiDeTai = selectedLoaiDeTai == null ? "" : selectedLoaiDeTai.MaLoaiDeTai;
            var frm = new FormQuanLyLoaiDeTai();
            frm.ShowDialog();
            NapDanhSachLoaiDeTai(selectedMaLoaiDeTai);
        }

        private void txtTuKhoa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (txtTuKhoa.Text.Length > 0)
                {
                    btnApplyFilter.PerformClick();
                    e.SuppressKeyPress = true;
                    e.Handled = true;
                }
            }
        }
    }
}
